package com.gitee.wsl.prism4j

//import java.io.IOException
//import java.nio.charset.StandardCharsets
//
//object TestUtils {
//    private const val DELIMITER = "-{52}"
//
//    private val GSON: Gson = Gson()
//
//    fun testFiles(lang: String): MutableCollection<Any?> {
//        val folder = "languages/" + lang + "/"
//
//        try {
//            TestUtils::class.java.getClassLoader().getResourceAsStream(folder).use { `in` ->
//                return Ix.from(IOUtils.readLines(`in`, StandardCharsets.UTF_8))
//                    .filter(object : IxPredicate<String?>() {
//                        public override fun test(s: String): Boolean {
//                            return s.endsWith(".test")
//                        }
//                    })
//                    .map(object : IxFunction<String?, String?>() {
//                        public override fun apply(s: String): String {
//                            return folder + s
//                        }
//                    })
//                    .toList() as MutableCollection<*>
//            }
//        } catch (e: IOException) {
//            throw RuntimeException(e)
//        }
//    }
//
//    fun readCase(file: String): Case {
//        val raw: String
//        try {
//            raw = IOUtils.resourceToString(file, StandardCharsets.UTF_8, TestUtils::class.java.getClassLoader())
//        } catch (t: Throwable) {
//            throw RuntimeException(t)
//        }
//
//        if (raw == null
//            || raw.length == 0
//        ) {
//            throw RuntimeException("Test file has no contents, file: " + file)
//        }
//
//        val split: Array<String?> =
//            raw.split(DELIMITER.toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
//        if (split.size < 2) {
//            throw RuntimeException("Test file seems to have wrong delimiter, file: " + file)
//        }
//
//        val input = split[0]!!.trim { it <= ' ' }
//        val simplifiedOutput: JsonArray =
//            GSON.fromJson(split[1]!!.trim { it <= ' ' }, JsonArray::class.java)
//        val description = split[2]!!.trim { it <= ' ' }
//
//        return Case(input, simplifiedOutput, description)
//    }
//
//    fun assertCase(c: Case, nodes: MutableList<out Prism4j.Node>) {
//        val expected: String? = c.simplifiedOutput.toString()
//        val actual: String? = simplify(nodes).toString()
//
//        try {
//            assertJsonEquals(expected, actual)
//        } catch (e: AssertionError) {
//            val newMessage = c.description + "\n" +
//                    "" + e.message + "\n" +
//                    "expected: " + expected + "\n" +
//                    "actual  : " + actual + "\n\n"
//            throw AssertionError(newMessage, e)
//        }
//    }
//
//    private fun simplify(nodes: MutableList<out Prism4j.Node>): JsonArray {
//        // root array
//        val array: JsonArray = JsonArray()
//        for (node in nodes) {
//            if (node is Prism4j.Text) {
//                val literal: String = (node as Prism4j.Text).literal()
//                if (literal.trim { it <= ' ' }.length != 0) {
//                    array.add(literal)
//                }
//            } else {
//                val syntax: Prism4j.Syntax = node as Prism4j.Syntax
//                val inner: JsonArray = JsonArray()
//                inner.add(syntax.type())
//                if (syntax.tokenized()) {
//                    inner.add(simplify(syntax.children()))
//                } else {
//                    inner.addAll(simplify(syntax.children()))
//                }
//                array.add(inner)
//            }
//        }
//        return array
//    }
//
//    class Case internal constructor(val input: String, simplifiedOutput: JsonArray, description: String) {
//        val simplifiedOutput: JsonArray
//        val description: String
//
//        init {
//            this.simplifiedOutput = simplifiedOutput
//            this.description = description
//        }
//    }
//}
